﻿Imports PTIC_GestionBDD
Imports Actuariat
Imports PTIC_Util
Imports PTIC_Util.GestionCalculs
Imports Actuariat.Comptes
Imports System.ComponentModel
Imports System.Collections
Imports System.Data
Imports OMANE.Common.Model
Imports OMANE.Common.Model.Interfaces
Imports OMANE.Common.Model.Echeancier
Imports OMANE.Common.Model.Parametrage

Namespace moteurTauxGaranti2

#Region "Moteur 2 - Coeur"
    ''' <summary>
    ''' Fonction de calcul du moteur de calcul du taux garanti par projection des comptes de résultats
    ''' </summary>
    ''' <remarks></remarks>
    Partial Public Class Moteur_Methode2
        Inherits baseMoteur

        Private m_Opimisation As Boolean = True
        Private m_TestTime As PTIC_Util.TestTime = New TestTimeImpl

        Public Enum TypeCalcul
            ScenarioCentral
            Simulations
        End Enum

#Region "Variables de classe"

        Protected m_ReferentielOMANE As IReferentielOMANE
        Protected _listeParametres As ParametresList
        Protected _capitauxInitiaux As ParamSpecifiqueModProj
        Protected _nbPretsAssuGen1 As ParamSpecifiqueModProj
        Protected _nbGenProj As Integer
        Protected _croissPopAssuNb As Double
        Protected _croissCapIni As Double
        Protected _filtreSegments As Integer
        Protected _filtreGeneration As Integer
        Protected _nbSegments As Integer
        Protected _moteurEcheancier As OMANE.Common.Model.Echeancier.AdapteMoteurEcheancier
        Private _fonctionCalculDataTable As fonctionCalculMoteur2
        Protected _scenarioCentral As scenarioCentralMoteur2
        Protected _simulations As simulationsMoteur2
        Protected _TypeCalcul As TypeCalcul

#End Region

#Region "Constructeur"
        ''' <summary>
        ''' Constructeur
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub New(ByVal nom As String,
                       ByVal coll_Param As ParametresList,
                       ByVal Referentiel As IReferentielOMANE,
                       ByVal TraitementEntree As RequeteBDD, _
                       ByVal TraitSumCapIni As RequeteBDD, _
                       ByVal TraitReqNbPretsXassu As RequeteBDD)

            MyBase.New(nom, coll_Param)

            m_TraitementEntree = TraitementEntree
            m_TraitReqSumCapIni = TraitSumCapIni
            m_TraitReqNbPretsXassu = TraitReqNbPretsXassu

            m_ReferentielOMANE = Referentiel

            _resultats = New resultatsMoteur2
            _moteurEcheancier = New AdapteMoteurEcheancier("moteurMethode2_Echeancier", coll_Param)
            Comptes = New ComptesMoteur2 With {.AnneePremiereGeneration = 2010}
            _fonctionCalculDataTable = New fonctionCalculMoteur2(TypeRecalcul.SurOrdre, Me, New EtatCalcul)
            _scenarioCentral = New scenarioCentralMoteur2(Me)
            _simulations = New simulationsMoteur2(Me)
            _TypeCalcul = TypeCalcul.ScenarioCentral
            listeParametres = coll_Param

            AddHandler _fonctionCalculDataTable.EtatCalculChanged, AddressOf onfonctionCalculMoteur2_EtatCalculValueChanged

            defaut()
        End Sub
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub defaut()

            _capitauxInitiaux = New ParamSpecifiqueModProj(m_TraitReqSumCapIni)
            AddHandler _capitauxInitiaux.hasChanged, AddressOf onParamGlobalMoteur2_hasChanged
            capitauxInitiaux.valeurPerso = 1000000
            capitauxInitiaux.methodeCalcul = IParamSpecifiqueModProj.typeCalcul.Personnalisé

            _nbPretsAssuGen1 = New ParamSpecifiqueModProj(m_TraitReqNbPretsXassu)
            AddHandler _nbPretsAssuGen1.hasChanged, AddressOf onParamGlobalMoteur2_hasChanged
            nbPretsAssuGen1.valeurPerso = 1000
            nbPretsAssuGen1.methodeCalcul = IParamSpecifiqueModProj.typeCalcul.Personnalisé

            nbGenProj = 1
            _croissPopAssuNb = 0.05
            _croissCapIni = 0
            _filtreSegments = 0
            _filtreGeneration = 0

        End Sub
#End Region

        'Private m_univers As ModelTauxGarantis
        'Public ReadOnly Property Univers As IModelTauxGarantis
        '    Get
        '        Return m_univers
        '    End Get
        'End Property

        Private m_TraitReqSumCapIni As RequeteBDD
        Private m_TraitReqNbPretsXassu As RequeteBDD

        Private m_TraitementEntree As RequeteBDD
        Public ReadOnly Property TraitementEntree As RequeteBDD
            Get
                Return m_TraitementEntree
            End Get
        End Property

#Region "Propriétés"

        ''' <summary>
        ''' Etat d'exécution de la fonction de calcul du moteur dans l'univers de travail
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        ''' 
        Public Overloads ReadOnly Property etatExecDataTable() As ValueEtatCalcul
            Get
                Return _fonctionCalculDataTable.EtatCalcul
            End Get
        End Property

        ' ''' <summary>
        ' ''' Tables de travail utilisées par le moteur (table de mortalité, INCAP/INVAL)
        ' ''' </summary>
        ' ''' <value></value>
        ' ''' <returns></returns>
        ' ''' <remarks></remarks>
        'Public ReadOnly Property tablesDeTravail() As tablesTravail
        '    Get
        '        Return _tablesTravail
        '    End Get
        'End Property

        ''' <summary>
        ''' Les comptes résultats du moteur de calcul 2
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property Comptes As ComptesMoteur2
            Get
                Return _Comptes
            End Get
            Private Set(ByVal value As ComptesMoteur2)
                OnPropertyChanging("Comptes")
                Dim e As New PropertyChangeEventArgs(Of ComptesMoteur2)(Comptes, value)
                If e.IsValide Then RaiseEvent ComptesChanging(Me, e)
                If e.IsValide Then
                    _Comptes = e.NewValue
                    OnPropertyChanged("Comptes")
                    RaiseEvent ComptesChanged(Me, e)
                End If
            End Set
        End Property
        Private _Comptes As ComptesMoteur2
        Public Event ComptesChanging As PropertyChangeEventHandler(Of ComptesMoteur2)
        Public Event ComptesChanged As PropertyChangeEventHandler(Of ComptesMoteur2)

        ''' <summary>
        ''' Résultats de l'exécution du moteur de calcul
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads ReadOnly Property Resultats() As resultatsMoteur2
            Get
                Return _resultats
            End Get
        End Property

        ''' <summary>
        ''' Scénario central
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property scenarioCentral() As scenarioCentralMoteur2
            Get
                Return _scenarioCentral
            End Get
        End Property

        ''' <summary>
        ''' Simulations
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public ReadOnly Property Simulations() As simulationsMoteur2
            Get
                Return _simulations
            End Get
        End Property

        ''' <summary>
        ''' Type de scénario calculé
        ''' </summary>
        ''' <remarks></remarks>
        Public Property TypeScenarioCalcule() As TypeCalcul
            Get
                Return _TypeCalcul
            End Get
            Friend Set(ByVal value As TypeCalcul)
                _TypeCalcul = value
            End Set
        End Property

#Region "Paramètres communs aux modèles 1 et 2"
        ''' <summary>
        ''' Liste des paramètres communs à toutes les méthodes de calcul du taux garanti
        ''' </summary>
        ''' <remarks></remarks>
        Public Property listeParametres() As ParametresList
            Get
                Return _listeParametres
            End Get
            Set(ByVal value As ParametresList)
                If Not value Is _listeParametres Then
                    If Not _listeParametres Is Nothing Then
                        For Each param As BaseParametre In _listeParametres.Values
                            If param.Methode_Cal(1) Then RemoveHandler param.hasChanged, AddressOf onParametreHasChanged
                        Next
                    End If
                    If Not value Is Nothing Then
                        For Each param As BaseParametre In value.Values
                            If param.Methode_Cal(1) Then AddHandler param.hasChanged, AddressOf onParametreHasChanged
                        Next
                    End If
                    _listeParametres = value
                End If
            End Set
        End Property
#End Region
#Region "Filtres à effectuer pour les projections"
        ''' <summary>
        ''' Le filtre retenu pour le segment affiché
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property filtreSegment() As Integer
            Get
                Return _filtreSegments
            End Get
            Set(ByVal value As Integer)
                If value <> _filtreSegments Then
                    _filtreSegments = value
                    RaiseEvent FiltreSegmentsChanged(Me, New EventArgs)
                End If
            End Set
        End Property

        ''' <summary>
        ''' Le filtre retenu pour la génération
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property filtreGeneration() As Integer
            Get
                Return _filtreGeneration
            End Get
            Set(ByVal value As Integer)
                If value <> _filtreGeneration Then
                    _filtreGeneration = value
                    RaiseEvent FiltreGenerationsChanged(Me, New EventArgs)
                End If
            End Set
        End Property
#End Region
#Region "Paramètres spécifiques au moteur 2"
        ''' <summary>
        ''' Capitaux initiaux
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property capitauxInitiaux() As ParamSpecifiqueModProj
            Get
                Return _capitauxInitiaux
            End Get
        End Property

        ''' <summary>
        ''' Nombre de prêts assurés de la génération 1
        ''' </summary>
        ''' <remarks></remarks>
        Public ReadOnly Property nbPretsAssuGen1() As ParamSpecifiqueModProj
            Get
                Return _nbPretsAssuGen1
            End Get
        End Property

        ''' <summary>
        ''' Nombre de générations projetées
        ''' </summary>
        ''' <remarks></remarks>
        Public Property nbGenProj As Integer
            Get
                Return _nbGenProj
            End Get
            Set(ByVal value As Integer)
                If value <> _nbGenProj Then
                    _nbGenProj = value
                    RaiseEvent NbGenerationsProjeteesChanged(Me, New EventArgs)
                End If
            End Set
        End Property

        ''' <summary>
        ''' Taux de croissance annuel du nombre d'assurés
        ''' </summary>
        ''' <remarks></remarks>
        Public Property croissPopAssuNb() As Double
            Get
                Return _croissPopAssuNb
            End Get
            Set(ByVal value As Double)
                If value <> _croissPopAssuNb Then
                    _croissPopAssuNb = value
                    RaiseEvent CroissNbPretsChanged(Me, New EventArgs)
                End If
            End Set
        End Property

        ''' <summary>
        ''' Taux de croissance annuel des capitaux initiaux
        ''' </summary>
        ''' <remarks></remarks>
        Public Property croissCapIni() As Double
            Get
                Return _croissCapIni
            End Get
            Set(ByVal value As Double)
                If value <> _croissCapIni Then
                    _croissCapIni = value
                    RaiseEvent CroissCImoyensChanged(Me, New EventArgs)
                End If
            End Set
        End Property
#End Region
#End Region

#Region "Méthodes de lancement des calculs"

        ''' <summary>
        ''' Initialisation de la procédure de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub CalculeInit()
            Resultats.clear()
            'Faire les jointures avec les paramètres déclinés pour récupérer les valeurs courantes
            Dim parametres_decl As Hashtable
            Dim parametres_uniq As Hashtable
            'Dim selMedic As Double()
            listeParametres.MAJ_CollParamDeclUniq(2)
            parametres_decl = listeParametres.GetParamDecl
            parametres_uniq = listeParametres.getParamUniq
            For Each p As IParametre In parametres_uniq.Values
                p.ValeurEnCoursAsObject = p.ValeurUniqueAsObject
            Next
            Dim TableEntree As DataTable
            With m_TraitementEntree
                .Calculer_DataTable()
                TableEntree = .DataTableResultat.Copy
            End With

            enrichieDataTableEntree(TableEntree)
            Resultats.TableEntreeEnrichie = TableEntree
            'Paramétrage de toutes les relations liées à la mise à jour des paramètres déclinés
            listeParametres.ParamRelationsV2(parametres_decl, TableEntree, Me.DataSet)
        End Sub

        ''' <summary>
        ''' Lancement de la procédure de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub Calculer()
            If m_Opimisation Then
                ' MsgBox("Début du travail d'optimisation")
                m_TestTime.StartTimer(0)
            End If
            If _fonctionCalculDataTable Is Nothing Then Exit Sub
            If _fonctionCalculDataTable.EtatCalcul <> ValueEtatCalcul.A_JOUR Then _fonctionCalculDataTable.Calculer()
            _fonctionCalculDataTable.ModeRecalcul = TypeRecalcul.Automatique
        End Sub

        ''' <summary>
        ''' Remise à niveau de l'espace de travail à la fin de la procédure de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub CalculeCloture()
            Dim parametres_decl As Hashtable = listeParametres.GetParamDecl
            listeParametres.SupprParamRelations(parametres_decl, Me.DataSet)
        End Sub

        ''' <summary>
        ''' Active la fonction de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub validePossibiliteCalcule()
            _fonctionCalculDataTable.EstCalculable()
        End Sub
        ''' <summary>
        ''' Désactive la fonction de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub invalidePossibiliteCalcule()
            _fonctionCalculDataTable.EstNonCalculable()
        End Sub
        ''' <summary>
        ''' Invalide la fonction de calcul
        ''' </summary>
        ''' <remarks></remarks>
        Public Overrides Sub invalideAll()
            RaiseEvent InvaliderCalculs(Me, New EventArgs)
        End Sub

#End Region

#Region "Méthodes d'exécution héritées de la classe traitement"
        ''' <summary>
        ''' Méthode héritée de la classe traitement et permettant de lancer les calculs du moteur 2 et de stocker la table en sortie dans la base de données
        ''' </summary>
        ''' <remarks></remarks>
        Protected Overrides Sub execute_BDD()
        End Sub
        ''' <summary>
        ''' Méthode héritée de la classe traitement et permettant de lancer les calculs du moteur 2 et de stocker la table en sortie dans l'univers de travail
        ''' </summary>
        ''' <remarks></remarks>
        Protected Overrides Sub execute_DataTable()
        End Sub

        'Public Overrides Function execute_DataTableToDgv(ByVal stockageBDDlocale As Boolean, ByVal dgv As System.Windows.Forms.DataGridView) As System.Data.DataTable
        '    Return Nothing
        'End Function
#End Region

#Region "Traitement des évènements reçus de l'extérieur"
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub onParamGlobalMoteur2_hasChanged(ByVal sender As Object, _
                                                 ByVal e As ParamSpecifiqueModProjEventArgs)

            If sender Is _capitauxInitiaux Then
                RaiseEvent CapitauxInitiauxChanged(Me, New EventArgs)
            ElseIf sender Is _nbPretsAssuGen1 Then
                RaiseEvent NbPretsInitiauxChanged(Me, New EventArgs)
            End If

        End Sub

        Private Sub onParametreHasChanged(ByVal sender As Object, ByVal e As EventArgs)
            RaiseEvent ParametreHasChanged(sender, e)
            Me.invalideAll()
        End Sub

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub onfonctionCalculMoteur2_EtatCalculValueChanged(ByVal sender As Object, ByVal e As EventArgs)
            RaiseEventEtatCalculDataTableAChange(Me, New EventArgs)
        End Sub

#End Region

#Region "Evènements générés"
        Public Event FiltreSegmentsChanged As EventHandler
        Public Event FiltreGenerationsChanged As EventHandler
        Public Event SegmentationRetenueChanged As EventHandler
        Public Event NbGenerationsProjeteesChanged As EventHandler
        Public Event CapitauxInitiauxChanged As EventHandler
        Public Event NbPretsInitiauxChanged As EventHandler
        Public Event CroissCImoyensChanged As EventHandler
        Public Event CroissNbPretsChanged As EventHandler
        Public Event ProjectionsDetailleesGen1_AfterCalculer As EventHandler
        Public Event ProjectionsAnnuellesGen1_AfterCalculer As EventHandler
        Public Event ProjectionAnnuellesGenN_AfterCalculer As EventHandler
        Public Event Comptes_AfterCalculer As EventHandler
        Public Event InvaliderCalculs As EventHandler
        Public Event ParametreHasChanged As EventHandler
#End Region

#Region "Paramétrage d'une projection"
        Protected Structure parametreEntreeProjection
            Dim nbPeriode As Integer
            Dim ageInitial As Double
            Dim capitalInitial As Double
            Dim txNominalPeriode As Double
            Dim nbInitialAssures As Double
            Dim txRembAntiPeriode As Double
            Dim txEntreeINCINVmois As Double
            Dim txTaxeINCINV As Double
            Dim txFG As Double
            Dim txTechPeriode As Double
            Dim tarifINCINVPeriode As Double
            Dim tarifDCPeriode As Double
            Dim ageFinINCINV As Double
            Dim ageFinDC As Double
            Dim txComPartenaire As Double
            Dim abtMNO As Double
            Dim abtPerteRevenus As Double
            Dim majSinDC As Double
            Dim majSinINCINV As Double
            Dim tableMort As ITableMortalite
            Dim tableMaintienINCINV As ITableMaintienINCAPINVAL
            Dim selectionMedicale As Double()
            Dim presenceSelectionMedicale As Boolean
        End Structure
#End Region

    End Class

#End Region

#Region "Moteur 2 - Fonctions de calcul"
    Partial Public Class Moteur_Methode2
#Region "Procédures / étapes de calcul interne"

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub calculProjectionDetailleesGen1()

            Try

                'Faire les jointures avec les paramètres déclinés pour récupérer les valeurs courantes
                Dim parametres_decl As Hashtable
                Dim parametres_uniq As Hashtable
                Dim selMedic As Double()
                parametres_decl = listeParametres.GetParamDecl
                parametres_uniq = listeParametres.getParamUniq

                Dim resultatProjection As DataTable = newDataTableResultatProjections()
                Dim numSegment As Integer = 1
                Dim anneeReelleMax As Integer = 0

                Dim Compteur As Integer = 0
                Dim StopWatchTest As New Stopwatch

                For Each rowEntree As DataRow In Resultats.TableEntreeEnrichie.Rows

                    Compteur += 1
                    If Compteur = 2 Then StopWatchTest.Start()

                    If Compteur = 100 Then
                        Dim nbTotLigne As Integer = Resultats.TableEntreeEnrichie.Rows.Count
                        StopWatchTest.Stop()
                        MsgBox(Compteur & " itérations atteintes. Temps en s : " & (StopWatchTest.ElapsedMilliseconds) / 1000 & vbCrLf & _
                               "Temps estimé pour " & nbTotLigne & " lignes : " & vbCrLf & _
                               ((StopWatchTest.ElapsedMilliseconds / (1000 * 60)) / Compteur) * nbTotLigne & " minutes.")

                    End If

                    'Mise à jour des valeurs en cours des paramètres déclinés (y compris sensibilités)
                    For Each p As IParametre In parametres_decl.Values
                        If p.Nom <> nomSel_medic Then
                            p.ValeurEnCoursAsObject = rowEntree.GetChildRows("relParam" & p.Nom)(0)(p.Nom)
                            rowEntree(p.Nom) = rowEntree.GetChildRows("relParam" & p.Nom)(0)(p.Nom)
                            'Intégrer la gestion de la sélection médicale
                        Else
                            Dim result(rowEntree.GetChildRows("relParam" & p.Nom).Count - 1) As Double
                            For Each rowAbattement As DataRow In rowEntree.GetChildRows("relParam" & p.Nom)
                                result(rowAbattement(ParametreSelectionMedicale.nomNbAnneesDeroulement) - 1) = _
                                       rowAbattement(ParametreSelectionMedicale.nomAbattementSelMedi)
                            Next
                            p.ValeurEnCoursAsObject = result
                            selMedic = p.ValeurEnCoursAsObject
                        End If
                    Next

                    'Récupération des paramètres pour alimentation du moteur
                    Dim paramEntreeProj As parametreEntreeProjection = genereParamEntreeProjectionSegment(rowEntree)

                    Dim resultProjSeg As DataTable = executeProjectionSegment(paramEntreeProj)

                    Dim hasINCINV As Boolean = (rowEntree(nomIdOption) = "DC/ITT-IPT")
                    ajouteProjSegAresultatProjections(numSegment, 1, resultProjSeg, _
                                                      resultatProjection, hasINCINV, anneeReelleMax)
                    numSegment = numSegment + 1
                Next

                'Ajout du résultat détaillé de la projection globale dans les résultats
                Resultats.TableProjectionGen1Detaillee = resultatProjection.Copy
                Resultats.ProjAnneeReelleMax = anneeReelleMax + 1


            Catch ex As Exception
                MsgBox("L'erreur suivante s'est produite durant l'exécution du moteur " & ex.Message)
            End Try

        End Sub
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub calculProjectionAnuelleGen1()
            Dim resultatProjection As DataTable = Resultats.TableProjectionGen1Detaillee
            Dim anneeReelleMax As Integer = Resultats.ProjAnneeReelleMax
            'Résultats agrégés par années d'observation
            Dim resultatProjectionAgregee As ProjectionAnneesReelles = agregeResultatProjection(resultatProjection, _
                                                                                                anneeReelleMax, _
                                                                                                filtreGeneration, _
                                                                                                filtreSegment)
            Resultats.ProjectionGen1Annuelle = resultatProjectionAgregee
        End Sub
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub calculEmpilementGenerations()

            'Optimisation de l'algorithme de calcul
            Dim anneeRelleMax As Integer = Resultats.ProjAnneeReelleMax
            Dim projectionGen1 As ProjectionAnneesReelles = Resultats.ProjectionGen1Annuelle
            Dim projectionGenN As New ProjectionAnneesReelles

            With projectionGenN

                'OK
                .NbAnneesProj = anneeRelleMax + nbGenProj - 1
                '-2 à cause des indices qui commencent à 0
                ReDim .CSR_DC(anneeRelleMax + nbGenProj - 2)
                ReDim .Pcom_DC(anneeRelleMax + nbGenProj - 2)
                ReDim .SinReg_DC(anneeRelleMax + nbGenProj - 2)
                ReDim .PM_DCtheo(anneeRelleMax + nbGenProj - 2)
                ReDim .PCom_INCINV(anneeRelleMax + nbGenProj - 2)
                ReDim .SinRegINCINV(anneeRelleMax + nbGenProj - 2)
                ReDim .PM_INCINVtheo(anneeRelleMax + nbGenProj - 2)
                ReDim .PM_renteTheo(anneeRelleMax + nbGenProj - 2)
                ReDim .PPRC_INCINVtheo(anneeRelleMax + nbGenProj - 2)
                ReDim .MRS_Vie(anneeRelleMax + nbGenProj - 2)
                ReDim .NbCotDC(anneeRelleMax + nbGenProj - 2)
                ReDim .NbCotINCINV(anneeRelleMax + nbGenProj - 2)
                ReDim .NbSinDC(anneeRelleMax + nbGenProj - 2)
                ReDim .NbSinINCINV(anneeRelleMax + nbGenProj - 2)

                'Boucle sur les années d'observation
                For i = 1 To anneeRelleMax + nbGenProj - 1


                    'Boucle sur les générations
                    For j = Math.Max(1, i - anneeRelleMax + 1) To Math.Min(i, nbGenProj)
                        If (filtreGeneration = 0 Or filtreGeneration = j) Then
                            .CSR_DC(i - 1) = .CSR_DC(i - 1) + projectionGen1.CSR_DC(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .Pcom_DC(i - 1) = .Pcom_DC(i - 1) + projectionGen1.Pcom_DC(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .SinReg_DC(i - 1) = .SinReg_DC(i - 1) + projectionGen1.SinReg_DC(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .PM_DCtheo(i - 1) = .PM_DCtheo(i - 1) + projectionGen1.PM_DCtheo(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .PCom_INCINV(i - 1) = .PCom_INCINV(i - 1) + projectionGen1.PCom_INCINV(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .SinRegINCINV(i - 1) = .SinRegINCINV(i - 1) + projectionGen1.SinRegINCINV(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .PM_INCINVtheo(i - 1) = .PM_INCINVtheo(i - 1) + projectionGen1.PM_INCINVtheo(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .PM_renteTheo(i - 1) = .PM_renteTheo(i - 1) + projectionGen1.PM_renteTheo(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .PPRC_INCINVtheo(i - 1) = .PPRC_INCINVtheo(i - 1) + projectionGen1.PPRC_INCINVtheo(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .MRS_Vie(i - 1) = .MRS_Vie(i - 1) + projectionGen1.MRS_Vie(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)

                            .NbCotDC(i - 1) = .NbCotDC(i - 1) + projectionGen1.NbCotDC(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .NbCotINCINV(i - 1) = .NbCotINCINV(i - 1) + projectionGen1.NbCotINCINV(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .NbSinDC(i - 1) = .NbSinDC(i - 1) + projectionGen1.NbSinDC(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                            .NbSinINCINV(i - 1) = .NbSinINCINV(i - 1) + projectionGen1.NbSinINCINV(i - j) * ((1 + croissCapIni) * (1 + croissPopAssuNb)) ^ (j - 1)
                        End If
                    Next

                Next

            End With
            Resultats.ProjectionGenNAnnuelle = projectionGenN
        End Sub
        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub calculComptes()

            Try
                Dim anneeReelleMax As Integer = Resultats.ProjAnneeReelleMax

                'Mise à jour des comptes
                Comptes.ModeRecalcul = TypeRecalcul.SurOrdre
                'Résultats agrégés par années d'observation
                Dim resultatProjectionAgregee As ProjectionAnneesReelles = Resultats.ProjectionGenNAnnuelle

                Comptes.ListeParametres = listeParametres
                Comptes.ProjectionsAnnuelles = resultatProjectionAgregee
                Comptes.NombreAnneesProjection = anneeReelleMax + nbGenProj - 1
                Comptes.Calculer()
                Resultats.compteCRTVie = Comptes.CompteTechniqueVie.Resultats
                Resultats.compteCRTNonVie = Comptes.CompteTechniqueNonVie.Resultats
                Resultats.compteCRNonTechnique = Comptes.CompteNonTechnique.Resultats
                Resultats.compteBesoinsFdsPropres = Comptes.CompteBesoinFondsPropres.Resultats
                Resultats.compteBilan = Comptes.Bilan.Resultats
                Resultats.compteTresorerie = Comptes.CompteTresorerie.Resultats
                Resultats.compteIndicateur = Comptes.Indicateur.Resultats
                Comptes.ModeRecalcul = TypeRecalcul.Automatique

                If TypeScenarioCalcule = TypeCalcul.ScenarioCentral Then
                    scenarioCentral.resultats.TableEntreeEnrichie = Resultats.TableEntreeEnrichie.Copy
                    scenarioCentral.resultats.ProjAnneeReelleMax = Resultats.ProjAnneeReelleMax
                    scenarioCentral.resultats.TableProjectionGen1Detaillee = Resultats.TableProjectionGen1Detaillee.Copy
                    scenarioCentral.resultats.ProjectionGen1Annuelle = Resultats.ProjectionGen1Annuelle.Copy
                    scenarioCentral.resultats.ProjectionGenNAnnuelle = Resultats.ProjectionGenNAnnuelle.Copy
                    scenarioCentral.resultats.compteBesoinsFdsPropres = Resultats.compteBesoinsFdsPropres.Copy
                    scenarioCentral.resultats.compteCRTVie = Resultats.compteCRTVie.Copy
                    scenarioCentral.resultats.compteCRTNonVie = Resultats.compteCRTNonVie.Copy
                    scenarioCentral.resultats.compteCRNonTechnique = Resultats.compteCRNonTechnique.Copy
                    scenarioCentral.resultats.compteBilan = Resultats.compteBilan.Copy
                    scenarioCentral.resultats.compteTresorerie = Resultats.compteTresorerie.Copy
                    scenarioCentral.resultats.compteIndicateur = Resultats.compteIndicateur.Copy
                End If

            Catch ex As Exception
                MsgBox("L'erreur suivante s'est produite durant l'exécution du moteur " & ex.Message)
            End Try

        End Sub

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub enrichieDataTableEntree(ByVal TableEntree As DataTable)
            With TableEntree.Columns
                If Not .Contains("AGE_SOUS_AN_ACTU") Then .Add("AGE_SOUS_AN_ACTU", GetType(Double))
                If Not .Contains("nbPretsAssuMoteur") Then .Add("nbPretsAssuMoteur", GetType(Double))
                If Not .Contains(nomCapIni) Then .Add(nomCapIni, GetType(Double))
                If Not .Contains(nomTx_abat_MalaNonObje) Then .Add(nomTx_abat_MalaNonObje, GetType(Double))
                If Not .Contains(nomTx_abat_ExclPerteRev) Then .Add(nomTx_abat_ExclPerteRev, GetType(Double))
                If Not .Contains(nomAge_FinDC) Then .Add(nomAge_FinDC, GetType(Double))
                If Not .Contains(nomAge_FinINCINV) Then .Add(nomAge_FinINCINV, GetType(Double))
                If Not .Contains(nomTx_Majo_sinDCPTIA) Then .Add(nomTx_Majo_sinDCPTIA, GetType(Double))
                If Not .Contains(nomTx_MajoPrudSinINCINV) Then .Add(nomTx_MajoPrudSinINCINV, GetType(Double))
                If Not .Contains(nomTx_CommiContA) Then .Add(nomTx_CommiContA, GetType(Double))
                If Not .Contains("txEntreeINCINVmois") Then .Add("txEntreeINCINVmois", GetType(Double))
                If Not .Contains(nomTx_fraiGestA) Then .Add(nomTx_fraiGestA, GetType(Double))
                If Not .Contains("txNominalPeriode") Then .Add("txNominalPeriode", GetType(Double))
                If Not .Contains("txRembAntiPeriode") Then .Add("txRembAntiPeriode", GetType(Double))
                If Not .Contains(nomTx_TaxeAssu) Then .Add(nomTx_TaxeAssu, GetType(Double))
                If Not .Contains("txTechPeriode") Then .Add("txTechPeriode", GetType(Double))
                If Not .Contains("PCom_DC") Then .Add("PCom_DC", GetType(Double))
                If Not .Contains("PCom_INCINV") Then .Add("PCom_INCINV", GetType(Double))
                If Not .Contains("FdsPropresSurMSR") Then .Add("FdsPropresSurMSR", GetType(Double))
                If Not .Contains("prixPTIA") Then .Add("prixPTIA", GetType(Double))
                If Not .Contains("chgtSecuINCAPINVAL") Then .Add("chgtSecuINCAPINVAL", GetType(Double))
                If Not .Contains("TxRdtActifs") Then .Add("TxRdtActifs", GetType(Double))
                If Not .Contains("TxCouvEmprSub") Then .Add("TxCouvEmprSub", GetType(Double))
                If Not .Contains("TxImpoIS") Then .Add("TxImpoIS", GetType(Double))
                If Not .Contains("coutEmprSub") Then .Add("coutEmprSub", GetType(Double))
                If Not .Contains("TxRendtAttenduActionnaires") Then .Add("TxRendtAttenduActionnaires", GetType(Double))
                If Not .Contains("PresenceSelMedic") Then .Add("PresenceSelMedic", GetType(Boolean))
            End With
        End Sub
        ''' <summary>
        ''' Initialisation des paramètre nécessaires à la projection d'un segment
        ''' </summary>
        ''' <param name="tbleEntreeDataRow"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function genereParamEntreeProjectionSegment(ByVal tbleEntreeDataRow As DataRow)

            'Récupération des paramètres relatifs à la ligne en cours d'étude
            Dim paramEntreeProj As New parametreEntreeProjection

            paramEntreeProj.abtMNO = listeParametres.Tx_abat_MalaNonObje.ValeursEnCours
            paramEntreeProj.abtPerteRevenus = listeParametres.Tx_abat_ExclPerteRev.ValeursEnCours
            paramEntreeProj.ageFinDC = listeParametres.Age_FinDC.ValeursEnCours
            paramEntreeProj.ageFinINCINV = listeParametres.Age_FinINCINV.ValeursEnCours
            paramEntreeProj.nbPeriode = CInt(listeParametres.Duree_Actu.ValeursEnCours)
            paramEntreeProj.majSinDC = listeParametres.Tx_Majo_sinDCPTIA.ValeursEnCours
            paramEntreeProj.majSinINCINV = listeParametres.Tx_MajoPrudSinINCINV.ValeursEnCours
            paramEntreeProj.nbInitialAssures = nbPretsAssuGen1.valeurPourMoteur(tbleEntreeDataRow.Item(nomNbPretsXassu))
            'Le moteur de l'échéancier attend le capital initial moyen
            paramEntreeProj.capitalInitial = capitauxInitiaux.valeurPourMoteur(tbleEntreeDataRow.Item(nomSumCapIni)) / paramEntreeProj.nbInitialAssures
            paramEntreeProj.txComPartenaire = listeParametres.Tx_CommiContA.ValeursEnCours
            paramEntreeProj.txEntreeINCINVmois = listeParametres.Tx_mensEntreeINCINV.ValeursEnCours
            paramEntreeProj.txFG = listeParametres.Tx_fraiGestA.ValeursEnCours
            paramEntreeProj.txNominalPeriode = Mensualise_tx(listeParametres.TxNom_Actu.ValeursEnCours, TypeMensualisation.TauxProportionel)
            paramEntreeProj.txRembAntiPeriode = Mensualise_tx(listeParametres.Tx_RembAntiA.ValeursEnCours, TypeMensualisation.TauxProportionel)
            paramEntreeProj.txTaxeINCINV = listeParametres.Tx_TaxeAssu.ValeursEnCours
            paramEntreeProj.txTechPeriode = Mensualise_tx(listeParametres.Tx_TechA.ValeursEnCours, TypeMensualisation.TauxEquivalent)

            'Les tables de travail
            Dim TableMort As ITableMortalite

            If tbleEntreeDataRow.Item(nomSexeAssu) = "H" Then

                Dim NomFichierTableMortH As String = listeParametres.Table_Mortalite_H.ValeurUnique
                Dim NomTableMortH As String = _
                    (From elt As IInfoTableReferentiel In m_ReferentielOMANE.TablesMortalite.InfoTables
                    Select elt
                    Where elt.NomFichier = NomFichierTableMortH).AsEnumerable.FirstOrDefault.NomTable
                TableMort = m_ReferentielOMANE.TablesMortalite.Factory.Item(NomTableMortH)

            Else

                tbleEntreeDataRow.Item(nomSexeAssu) = "F"

                Dim NomFichierTableMortF As String = listeParametres.Table_Mortalite_F.ValeurUnique
                Dim NomTableMortF As String = _
                    (From elt As IInfoTableReferentiel In m_ReferentielOMANE.TablesMortalite.InfoTables
                    Select elt
                    Where elt.NomFichier = NomFichierTableMortF).AsEnumerable.FirstOrDefault.NomTable
                TableMort = m_ReferentielOMANE.TablesMortalite.Factory.Item(NomTableMortF)

            End If

            paramEntreeProj.tableMort = TableMort

            Dim NomFichierTableINCINV As String = listeParametres.Tble_maintienINCINVM2.ValeurUnique
            Dim NomTableINCINVM2 As String = _
                (From elt As IInfoTableReferentiel In m_ReferentielOMANE.TablesINCINV.InfoTables
                Select elt
                Where elt.NomFichier = NomFichierTableINCINV).AsEnumerable.FirstOrDefault.NomTable

            paramEntreeProj.tableMaintienINCINV = m_ReferentielOMANE.TablesINCINV.Factory.Item(NomTableINCINVM2)

            'Les âges actuariels
            Dim qxAn As Double = listeParametres.TxMort_Actu.ValeursEnCours
            'Dim qxAn As Double = tbleEntreeDataRow.GetChildRows("relParam" & nomTxMort_Actu)(0)(nomTxMort_Actu)
            Dim qxMens As Double = 1 - (1 - qxAn) ^ (1 / 12)
            Dim ageActu As Integer = TableMort.AgeAnMinFromQxAn(qxMens)

            paramEntreeProj.ageInitial = ageActu

            'La sélection médicale
            paramEntreeProj.selectionMedicale = listeParametres.Sel_medic.ValeurEnCours
            paramEntreeProj.presenceSelectionMedicale = Not (listeParametres.Sel_medic.ValeurEnCours Is Nothing)

            'Les primes commeriales ajustées des dérogations
            Dim PcomDC_nonDerogMens As Double = Mensualise_tx(tbleEntreeDataRow.Item(nomPComDC_Non_Derog_Actu), TypeMensualisation.TauxProportionel)
            Dim PcomDC_DerogMens As Double = Mensualise_tx(tbleEntreeDataRow.Item(nomPComDC_Derog_Actu), TypeMensualisation.TauxProportionel)
            Dim PourDerogDC As Double = tbleEntreeDataRow.Item(nomPourDC_Derog_Actu)
            Dim PComINCINV_nonDerogMens As Double = Mensualise_tx(tbleEntreeDataRow.Item(nomPComINCINV_Non_Derog_Actu), TypeMensualisation.TauxProportionel)
            Dim PComINCINV_DerogMens As Double = Mensualise_tx(tbleEntreeDataRow.Item(nomPComINCINV_Derog_Actu), TypeMensualisation.TauxProportionel)
            Dim PourDerogINCINV As Double = tbleEntreeDataRow.Item(nomPourINCINV_Derog_Actu)
            paramEntreeProj.tarifDCPeriode = PcomDC_nonDerogMens * (1 - PourDerogDC) + PcomDC_DerogMens * PourDerogDC
            paramEntreeProj.tarifINCINVPeriode = PComINCINV_nonDerogMens * (1 - PourDerogINCINV) + PComINCINV_DerogMens * PourDerogINCINV

            tbleEntreeDataRow(nomTx_abat_MalaNonObje) = paramEntreeProj.abtMNO
            tbleEntreeDataRow(nomTx_abat_ExclPerteRev) = paramEntreeProj.abtPerteRevenus
            tbleEntreeDataRow(nomAge_FinDC) = paramEntreeProj.ageFinDC
            tbleEntreeDataRow(nomAge_FinINCINV) = paramEntreeProj.ageFinINCINV
            tbleEntreeDataRow(nomTx_Majo_sinDCPTIA) = paramEntreeProj.majSinDC
            tbleEntreeDataRow(nomTx_MajoPrudSinINCINV) = paramEntreeProj.majSinINCINV
            tbleEntreeDataRow(nomCapIni) = paramEntreeProj.capitalInitial
            tbleEntreeDataRow(nomTx_CommiContA) = paramEntreeProj.txComPartenaire
            tbleEntreeDataRow(nomTx_fraiGestA) = paramEntreeProj.txFG
            tbleEntreeDataRow(nomTx_TaxeAssu) = paramEntreeProj.txTaxeINCINV
            tbleEntreeDataRow("txNominalPeriode") = paramEntreeProj.txNominalPeriode
            tbleEntreeDataRow("txRembAntiPeriode") = paramEntreeProj.txRembAntiPeriode
            tbleEntreeDataRow("txTechPeriode") = paramEntreeProj.txTechPeriode
            tbleEntreeDataRow("nbPretsAssuMoteur") = paramEntreeProj.nbInitialAssures
            tbleEntreeDataRow("txEntreeINCINVmois") = paramEntreeProj.txEntreeINCINVmois

            tbleEntreeDataRow("AGE_SOUS_AN_ACTU") = ageActu
            With tbleEntreeDataRow
                tbleEntreeDataRow("PCom_DC") = .Item(nomPComDC_Non_Derog_Actu) * (1 - .Item(nomPourDC_Derog_Actu)) + .Item(nomPComDC_Derog_Actu) * .Item(nomPourDC_Derog_Actu)
                tbleEntreeDataRow("PCom_INCINV") = .Item(nomPComINCINV_Non_Derog_Actu) * (1 - .Item(nomPourINCINV_Derog_Actu)) + .Item(nomPComINCINV_Derog_Actu) * .Item(nomPourINCINV_Derog_Actu)
            End With
            tbleEntreeDataRow("FdsPropresSurMSR") = listeParametres.Tx_FondPropSurMSR.ValeursEnCours
            tbleEntreeDataRow("prixPTIA") = listeParametres.Tx_PrixGarantiePTIA.ValeursEnCours
            tbleEntreeDataRow("chgtSecuINCAPINVAL") = listeParametres.Tx_chgtSecuINCINV.ValeursEnCours
            tbleEntreeDataRow("TxRdtActifs") = listeParametres.Tx_RendActifsA.ValeursEnCours
            tbleEntreeDataRow("TxCouvEmprSub") = listeParametres.Tx_CouvEmprSuboA.ValeursEnCours
            tbleEntreeDataRow("TxImpoIS") = listeParametres.Tx_TaxeImpoA.ValeursEnCours
            tbleEntreeDataRow("coutEmprSub") = listeParametres.Tx_CoutEmprSuboA.ValeursEnCours
            tbleEntreeDataRow("TxRendtAttenduActionnaires") = listeParametres.Tx_RendActionnairesA.ValeursEnCours
            tbleEntreeDataRow("PresenceSelMedic") = paramEntreeProj.presenceSelectionMedicale

            Return paramEntreeProj
        End Function
        ''' <summary>
        ''' Exécute la projection d'un segment (une fois les paramètres correctement initialisés)
        ''' </summary>
        ''' <param name="paramEntreeProj"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function executeProjectionSegment(ByVal paramEntreeProj As parametreEntreeProjection) As DataTable
            _moteurEcheancier.Recalcul = TypeRecalcul.SurOrdre
            _moteurEcheancier.AbtMNO = paramEntreeProj.abtMNO
            _moteurEcheancier.AbtPerteRev = paramEntreeProj.abtPerteRevenus
            _moteurEcheancier.AgeFinDC = paramEntreeProj.ageFinDC
            _moteurEcheancier.AgeFinINCINV = paramEntreeProj.ageFinINCINV
            _moteurEcheancier.AgeInit = paramEntreeProj.ageInitial
            _moteurEcheancier.CapIni = paramEntreeProj.capitalInitial
            _moteurEcheancier.LongueurProj = paramEntreeProj.nbPeriode
            _moteurEcheancier.MajSinDC = paramEntreeProj.majSinDC
            _moteurEcheancier.MajSinINCINV = paramEntreeProj.majSinINCINV
            _moteurEcheancier.NbInitAssures = paramEntreeProj.nbInitialAssures
            _moteurEcheancier.TableMaintienINCAPINVAL = paramEntreeProj.tableMaintienINCINV
            _moteurEcheancier.TableMort = paramEntreeProj.tableMort
            _moteurEcheancier.TarifDCMens = paramEntreeProj.tarifDCPeriode
            _moteurEcheancier.TarifINCINVMens = paramEntreeProj.tarifINCINVPeriode
            _moteurEcheancier.TxComPartenaire = paramEntreeProj.txComPartenaire
            _moteurEcheancier.TxEntreeINCINV = paramEntreeProj.txEntreeINCINVmois
            _moteurEcheancier.TxFG = paramEntreeProj.txFG
            _moteurEcheancier.TxNomMens = paramEntreeProj.txNominalPeriode
            _moteurEcheancier.TxRembAntiMens = paramEntreeProj.txRembAntiPeriode
            _moteurEcheancier.TxTaxeINCINV = paramEntreeProj.txTaxeINCINV
            _moteurEcheancier.TxTechMens = paramEntreeProj.txTechPeriode
            If paramEntreeProj.presenceSelectionMedicale Then
                _moteurEcheancier.SelectionMedicale.ValeurUnique = paramEntreeProj.selectionMedicale
            Else
                _moteurEcheancier.SelectionMedicale.ValeurUnique = Nothing
            End If

            _moteurEcheancier.calculScenarioCentral()


            Dim result As DataTable = _moteurEcheancier.Resultats.ProjectionAnnuelle

            Return _moteurEcheancier.Resultats.ProjectionAnnuelle
        End Function
        ''' <summary>
        ''' Création de la table empilant les projections annuelles de chaque segment
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function newDataTableResultatProjections() As DataTable
            Dim resultatProjectionGeneration As New DataTable
            resultatProjectionGeneration.Columns.Add("numGen", GetType(Integer))
            resultatProjectionGeneration.Columns.Add("numSegment", GetType(Integer))
            resultatProjectionGeneration.Columns.Add("anneeDeroulement", GetType(Integer))
            resultatProjectionGeneration.Columns.Add("anneeReelle", GetType(Integer))
            resultatProjectionGeneration.Columns.Add("CSRDCfin", GetType(Double))
            resultatProjectionGeneration.Columns.Add("cotisDC", GetType(Double))
            resultatProjectionGeneration.Columns.Add("sinDC", GetType(Double))
            resultatProjectionGeneration.Columns.Add("PM_DCtheo", GetType(Double))
            resultatProjectionGeneration.Columns.Add("cotisIT", GetType(Double))
            resultatProjectionGeneration.Columns.Add("sinIT", GetType(Double))
            resultatProjectionGeneration.Columns.Add("PM_Rente", GetType(Double))
            resultatProjectionGeneration.Columns.Add("PPRC", GetType(Double))
            resultatProjectionGeneration.Columns.Add("PM_ITtheo", GetType(Double))
            resultatProjectionGeneration.Columns.Add("MSR_Vie", GetType(Double))
            'Ajout des nombres de cotisants en DC et en INCAP INVAL ainsi que des nombre de sinistrés en DC et en INCAP/INVAL
            resultatProjectionGeneration.Columns.Add("nbCotDC", GetType(Double))
            resultatProjectionGeneration.Columns.Add("nbSinDC", GetType(Double))
            resultatProjectionGeneration.Columns.Add("nbCotINCINV", GetType(Double))
            resultatProjectionGeneration.Columns.Add("nbSinINCINV", GetType(Double))
            Return resultatProjectionGeneration
        End Function
        ''' <summary>
        ''' Permet d'ajouter une projection à la table résultat contenant toutes les projections des segments
        ''' </summary>
        ''' <param name="numSegment"></param>
        ''' <param name="numGeneration"></param>
        ''' <param name="resProjectionSegment"></param>
        ''' <param name="resProjection"></param>
        ''' <remarks></remarks>
        Private Sub ajouteProjSegAresultatProjections(ByVal numSegment As Integer, _
                                                      ByVal numGeneration As Integer, _
                                                      ByVal resProjectionSegment As DataTable, _
                                                      ByVal resProjection As DataTable, ByVal hasINCINV As Boolean, _
                                                      ByRef anneeReelleMax As Integer)
            For Each rowProjectionSegment As DataRow In resProjectionSegment.Rows
                Dim newRowProjection As DataRow = resProjection.NewRow()
                newRowProjection("numGen") = numGeneration
                newRowProjection("numSegment") = numSegment
                newRowProjection("anneeDeroulement") = rowProjectionSegment("numAnnee")
                newRowProjection("anneeReelle") = rowProjectionSegment("numAnnee") + numGeneration - 1
                If newRowProjection("anneeReelle") > anneeReelleMax Then anneeReelleMax = newRowProjection("anneeReelle")
                newRowProjection("CSRDCfin") = rowProjectionSegment("CSRDCfin")
                newRowProjection("cotisDC") = rowProjectionSegment("cotisDC")
                newRowProjection("sinDC") = rowProjectionSegment("sinDC")
                newRowProjection("PM_DCtheo") = rowProjectionSegment("PM_DCtheo")
                newRowProjection("cotisIT") = IIf(hasINCINV, rowProjectionSegment("cotisIT"), 0)
                newRowProjection("sinIT") = IIf(hasINCINV, rowProjectionSegment("sinIT"), 0)
                newRowProjection("PM_Rente") = IIf(hasINCINV, rowProjectionSegment("PM_Rente"), 0)
                newRowProjection("PPRC") = IIf(hasINCINV, rowProjectionSegment("PPRC"), 0)
                newRowProjection("PM_ITtheo") = IIf(hasINCINV, rowProjectionSegment("PM_ITtheo"), 0)
                newRowProjection("MSR_Vie") = rowProjectionSegment("MSR_Vie")

                newRowProjection("nbSinDC") = rowProjectionSegment("nbSinDC")
                newRowProjection("nbCotDC") = rowProjectionSegment("nbCotisants")
                newRowProjection("nbCotINCINV") = IIf(hasINCINV, rowProjectionSegment("nbCotisants"), 0)
                newRowProjection("nbSinINCINV") = IIf(hasINCINV, rowProjectionSegment("NbSinistresINCAPINVALFinPer"), 0)

                resProjection.Rows.Add(newRowProjection)
            Next
            'Dans cette méthode, il faut déterminer le nombre d'années de projection à afficher
            'Pour cela, il faut incrémenter un compteur
        End Sub
        ''' <summary>
        ''' Permet de passer de la projection mensuelle détaillée de la génération 1 à la projection annuelle
        ''' </summary>
        ''' <param name="resultatProjection"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Private Function agregeResultatProjection(ByVal resultatProjection As DataTable, _
                                                  ByVal nbAnneesProjetees As Integer, _
                                                  ByVal generation As Integer, _
                                                  ByVal segment As Integer) As ProjectionAnneesReelles
            Dim result As New ProjectionAnneesReelles
            'Faire une somme sur les années d'observation
            result.NbAnneesProj = nbAnneesProjetees
            ReDim result.CSR_DC(nbAnneesProjetees - 1)
            ReDim result.MRS_Vie(nbAnneesProjetees - 1)
            ReDim result.Pcom_DC(nbAnneesProjetees - 1)
            ReDim result.PCom_INCINV(nbAnneesProjetees - 1)
            ReDim result.PM_DCtheo(nbAnneesProjetees - 1)
            ReDim result.PM_INCINVtheo(nbAnneesProjetees - 1)
            ReDim result.PM_renteTheo(nbAnneesProjetees - 1)
            ReDim result.PPRC_INCINVtheo(nbAnneesProjetees - 1)
            ReDim result.SinReg_DC(nbAnneesProjetees - 1)
            ReDim result.SinRegINCINV(nbAnneesProjetees - 1)

            ReDim result.NbCotDC(nbAnneesProjetees - 1)
            ReDim result.NbSinDC(nbAnneesProjetees - 1)
            ReDim result.NbCotINCINV(nbAnneesProjetees - 1)
            ReDim result.NbSinINCINV(nbAnneesProjetees - 1)

            For Each r As DataRow In resultatProjection.Rows
                Dim anneeReelle As Integer = r("anneeReelle")
                Dim generationLigne As Integer = r("numGen")
                Dim segmentLigne As Integer = r("numSegment")
                If (segment = 0 Or segmentLigne = segment) Then
                    'Ajout de la fonction de filtre permettant de ne retenir que la génération ou le segment souhaité
                    result.CSR_DC(anneeReelle - 1) = result.CSR_DC(anneeReelle - 1) + r("CSRDCfin")
                    result.MRS_Vie(anneeReelle - 1) = result.MRS_Vie(anneeReelle - 1) + r("MSR_Vie")
                    result.Pcom_DC(anneeReelle - 1) = result.Pcom_DC(anneeReelle - 1) + r("cotisDC")
                    result.PCom_INCINV(anneeReelle - 1) = result.PCom_INCINV(anneeReelle - 1) + r("cotisIT")
                    result.PM_DCtheo(anneeReelle - 1) = result.PM_DCtheo(anneeReelle - 1) + r("PM_DCtheo")
                    result.PM_INCINVtheo(anneeReelle - 1) = result.PM_INCINVtheo(anneeReelle - 1) + r("PM_ITtheo")
                    result.PM_renteTheo(anneeReelle - 1) = result.PM_renteTheo(anneeReelle - 1) + r("PM_Rente")
                    result.PPRC_INCINVtheo(anneeReelle - 1) = result.PPRC_INCINVtheo(anneeReelle - 1) + r("PPRC")
                    result.SinReg_DC(anneeReelle - 1) = result.SinReg_DC(anneeReelle - 1) + r("sinDC")
                    result.SinRegINCINV(anneeReelle - 1) = result.SinRegINCINV(anneeReelle - 1) + r("sinIT")

                    result.NbSinDC(anneeReelle - 1) = result.NbSinDC(anneeReelle - 1) + r("nbSinDC")
                    result.NbCotDC(anneeReelle - 1) = result.NbCotDC(anneeReelle - 1) + r("nbCotDC")
                    result.NbSinINCINV(anneeReelle - 1) = result.NbSinINCINV(anneeReelle - 1) + r("nbSinINCINV")
                    result.NbCotINCINV(anneeReelle - 1) = result.NbCotINCINV(anneeReelle - 1) + r("nbCotINCINV")

                End If
            Next
            Return result
        End Function

#End Region
    End Class
#End Region

End Namespace
